/**
 * 地区工具函数
 * @description 提供地区代码到名称的映射功能
 * @author group2
 * @date 2025/11/03
 */

import regionData from '@/dict/yunnan_region_code.json';

/**
 * 构建地区Map缓存
 * key: code, value: { code, name, parent, children }
 */
const regionMap = new Map();

/**
 * 递归构建Map缓存
 */
function buildRegionMap(regions, map) {
  if (!regions || !Array.isArray(regions)) return;
  
  regions.forEach(region => {
    map.set(region.code, region);
    if (region.children && region.children.length > 0) {
      buildRegionMap(region.children, map);
    }
  });
}

// 初始化缓存
buildRegionMap(regionData, regionMap);

/**
 * 根据code获取地区名称
 * 
 * @param {number} code - 地区代码
 * @returns {string} 地区名称
 * 
 * @example
 * getNameByCode(530100) // "昆明市"
 * getNameByCode(530102) // "五华区"
 */
export function getNameByCode(code) {
  if (!code) return '未知';
  
  const region = regionMap.get(code);
  return region ? region.name : String(code);
}

/**
 * 根据code获取完整路径名称
 * 
 * @param {number} code - 地区代码
 * @returns {string} 完整路径（如：云南省/昆明市/五华区）
 * 
 * @example
 * getFullPathByCode(530102001) // "云南省/昆明市/五华区/华山街道"
 */
export function getFullPathByCode(code) {
  if (!code) return '未知';
  
  const path = [];
  let current = regionMap.get(code);
  
  // 向上追溯
  while (current) {
    path.unshift(current.name);
    const parentCode = current.parentId;
    current = parentCode ? regionMap.get(parentCode) : null;
  }
  
  return path.length > 0 ? `云南省/${path.join('/')}` : '未知';
}

/**
 * 获取所有市级地区（用于下拉选择）
 * 
 * @returns {Array} 市级地区列表
 * @example
 * getCities() 
 * // [{ code: 530100, name: "昆明市" }, { code: 530300, name: "曲靖市" }, ...]
 */
export function getCities() {
  return regionData.map(city => ({
    code: city.code,
    name: city.name,
  }));
}

/**
 * 获取指定市下的所有区县（用于级联选择）
 * 
 * @param {number} cityCode - 市代码
 * @returns {Array} 区县列表
 */
export function getCountiesByCity(cityCode) {
  const city = regionMap.get(cityCode);
  if (!city || !city.children) return [];
  
  return city.children.map(county => ({
    code: county.code,
    name: county.name,
  }));
}

/**
 * 获取指定区县下的所有街道（用于级联选择）
 * 
 * @param {number} countyCode - 区县代码
 * @returns {Array} 街道列表
 */
export function getStreetsByCounty(countyCode) {
  const county = regionMap.get(countyCode);
  if (!county || !county.children) return [];
  
  return county.children.map(street => ({
    code: street.code,
    name: street.name,
  }));
}

/**
 * 将地区数据转换为级联选择器格式
 * 
 * @returns {Array} 级联选择器数据
 * @example
 * getCascaderOptions()
 * // [
 * //   {
 * //     value: 530100,
 * //     label: "昆明市",
 * //     children: [
 * //       { value: 530102, label: "五华区", children: [...] }
 * //     ]
 * //   }
 * // ]
 */
export function getCascaderOptions() {
  const convertToCascader = (regions) => {
    return regions.map(region => {
      const option = {
        value: region.code,
        label: region.name,
      };
      
      if (region.children && region.children.length > 0) {
        option.children = convertToCascader(region.children);
      }
      
      return option;
    });
  };
  
  return convertToCascader(regionData);
}

/**
 * 批量转换codes为names
 * 
 * @param {Array<number>} codes - 地区代码数组
 * @returns {Array<string>} 地区名称数组
 * 
 * @example
 * batchGetNames([530100, 530300, 530400])
 * // ["昆明市", "曲靖市", "玉溪市"]
 */
export function batchGetNames(codes) {
  if (!codes || !Array.isArray(codes)) return [];
  return codes.map(code => getNameByCode(code));
}

/**
 * 根据code获取完整的地区对象
 * @param {number} code
 * @returns {object|null}
 */
export function getRegionByCode(code) {
  if (!code) return null;
  return regionMap.get(code) || null;
}

/**
 * 获取地区所属的顶级市级节点
 * @param {number} code - 任意层级的地区code
 * @returns {object|null} 市级地区对象
 */
export function getTopLevelCity(code) {
  if (!code) return null;
  let current = regionMap.get(code);
  if (!current) return null;

  const visited = new Set();
  while (current.parentId && !visited.has(current.code)) {
    visited.add(current.code);
    const parent = regionMap.get(current.parentId);
    if (!parent) break;
    current = parent;
  }

  return current;
}

/**
 * 导出默认对象（兼容不同导入方式）
 */
export default {
  getNameByCode,
  getFullPathByCode,
  getCities,
  getCountiesByCity,
  getStreetsByCounty,
  getCascaderOptions,
  batchGetNames,
  getRegionByCode,
  getTopLevelCity,
};
